package main

import (
	"fmt"
	"sort"
)

/**
学习GO语言的接口（interface）的定义，特性以及使用方式。掌握一个GO包——sort包。
用学到的知识实现下面的题目：
需要再Day4任务的基础上实现经典题目排序：要求使用GO语言的接口（interface）进行数据的排序。需要使用GO的基础包sort。待排序的内容是Day4中录入的房源信息（至少录入5条房源信息），然后对这批房源信息按照房源名称（字符串）、价格（整形数值），面积（浮点数数值）分别进行排序并按排好序的顺序输出到界面上。
*/

type House struct {
	sn string
	name string
	price int
	area float32
	isFirstRent bool
	tags string
}

//定义一个通用的结构体
type Bucket struct {
	Slice []interface{}  //承载以任意结构体为元素构成的Slice
	By func(a,b interface{})bool  //排序规则函数,当需要对新的结构体slice进行排序时，只需定义这个函数即可
}

/*
定义三个必须方法的准则：接收者不能为指针
*/
func (this Bucket)Len()int { return len(this.Slice)}

func (this Bucket)Swap(i,j int){ this.Slice[i],this.Slice[j] = this.Slice[j],this.Slice[i] }

func (this Bucket)Less(i,j int)bool { return this.By(this.Slice[i], this.Slice[j]) }



func main() {
	h1 := House{"BJ1", "劲松农光东里", 2899, 14.5, true, "学区房,紧邻地铁"}
	h2 := House{"BJ11", "劲松农光西里", 3899, 16.5, false, "学区房,紧邻地铁"}
	h3 := House{"BJ3", "劲松农光北里", 1899, 8.5, true, "学区房,紧邻地铁"}
	h4 := House{"BJ4", "劲松农光南里", 2699, 13.5, false, "学区房,紧邻地铁"}
	h5 := House{"BJ2", "魔方北里", 2199, 11.5, true, "学区房,紧邻地铁"}

	fmt.Println("name 排序")
	list_by_name := func(a,b interface{})bool {
		return a.(House).name < b.(House).name
	}
	list_by_price := func(a,b interface{})bool {
		return a.(House).price < b.(House).price
	}
	list_by_area := func(a,b interface{})bool {
		return a.(House).area < b.(House).area
	}
	hList := Bucket{}
	hList.Slice = append(hList.Slice, h1,h2,h3,h4,h5)
	hList.By = list_by_name
	sort.Sort(hList)
	fmt.Printf("%+v\n", hList.Slice)


	fmt.Println("\nprice 排序")
	hList.By = list_by_price
	sort.Sort(hList)
	fmt.Printf("%+v\n", hList.Slice)

	fmt.Println("\nprice 排序")
	hList.By = list_by_area
	sort.Sort(hList)
	fmt.Printf("%+v\n", hList.Slice)
	//
	//hList = Bucket{}
	//hList.Slice = append(hList.Slice, h1,h2,h3,h4,h5)
	//hList.By = list_by
	//sort.Sort(hList)
	//fmt.Printf("%+v\n", hList.Slice)
	//
	//fmt.Println("\narea 排序")
	//
	//hList = Bucket{}
	//hList.Slice = append(hList.Slice, h1,h2,h3,h4,h5)
	//hList.By = list_by
	//sort.Sort(hList)
	//fmt.Printf("%+v\n", hList.Slice)
}